package br.ufrgs.engsoft.ejb;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;

import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.Stateless;

import br.ufrgs.engsoft.ejb.local.DatabaseEJBLocal;
import br.ufrgs.engsoft.ejb.remote.AutorEJBRemote;
import br.ufrgs.engsoft.ejb.remote.ReferenciaEJBRemote;
import br.ufrgs.engsoft.entity.Autor;
import br.ufrgs.engsoft.entity.Referencia;

/**
 * Implementacao do bean de sessao Stateless.
 * Usado para obter informacoes sobre referencias.
 */
@Stateless
public class ReferenciaEJB implements ReferenciaEJBRemote {

	@EJB // A injecao ocorre no deploy da aplicacao
	private DatabaseEJBLocal database;
	
	@EJB // A injecao ocorre no deploy da aplicacao
	private AutorEJBRemote autorEJB;
	
	/*
	 * (non-Javadoc)
	 * @see br.ufrgs.engsoft.ejb.impl.ReferenciaEJB#incluirReferencia(br.ufrgs.engsoft.entity.Referencia)
	 */
	public Referencia incluirReferencia(Referencia referencia) {
		//
		if (referencia==null) throw new EJBException("Referencia nao pode ser nula!");
		
		// Caso nao informado usar auto-incremento
		if (referencia.getId()==null || referencia.getId()==0) referencia.setId(database.getNewReferenciaId());
		
		// Caso tenha referencia com mesmo Id retornar falso
		if (database.getReferencias().containsKey(referencia.getId())) throw new EJBException("Identificador da Referencia ja cadastrado!");
		
		// Validacao do preenchimento do campo titulo 
		if (referencia.getTitulo()==null || referencia.getTitulo().isEmpty()) throw new EJBException("Titulo deve ser informado!");
		
		// Validacao do preenchimento do campo titulo 
		if (referencia.getAutor()==null || referencia.getAutor().getId()==null || referencia.getAutor().getId()==0) throw new EJBException("Autor deve ser informado!");
		
		// Atribui o autor correspondente ao id
		Autor autor = autorEJB.getAutorById(referencia.getAutor().getId());
		if (autor==null) throw new EJBException("Autor nao encontrado!");
		referencia.setAutor(autor);
		
		// Adicionando nova referencia a tabela
		database.getReferencias().put(referencia.getId(), referencia);
		return referencia;
	}

	/*
	 * (non-Javadoc)
	 * @see br.ufrgs.engsoft.ejb.impl.ReferenciaEJB#listarReferencia()
	 */
	public Collection<Referencia> listarReferencia() {
		return database.getReferencias().values();
	}

	/*
	 * (non-Javadoc)
	 * @see br.ufrgs.engsoft.ejb.impl.ReferenciaEJB#listarReferencia()
	 */
	public Collection<Referencia> listarReferenciaPorAutor(Integer idAutor) {
		Collection<Referencia> retorno = new ArrayList<Referencia>();
		Collection<Referencia> referencias = database.getReferencias().values();
		for (Referencia ref : referencias) {
			if (idAutor.equals(ref.getAutor().getId())) retorno.add(ref);
		}
		return retorno;
	}
}
